﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace INSTA.Concepts.Delegates
{
    /// <summary>
    /// STEP 1 :
    /// On définit un nouveau type référence,
    /// nommé "TalkDelegate", et qui définit 
    /// la signature des méthodes vers lesquelles
    /// il peut "pointer".
    /// </summary>
    public delegate void TalkDelegate();

    public delegate long CalculationDelegate(int a, int b);

    public class Program
    {
        static void Main(string[] args)
        {
            //Test_Delegates_01();
            Test_Delegates_02();

        }


        public static void Test_Delegates_01()
        {
            // STEP 2 :
            // On déclare une variable du type du delegate.
            TalkDelegate del;

            // STEP 3 :
            // On instancie la variable de type delegate,
            // en lui passant dans son constructeur la 
            // méthode vers laquelle il doit "pointer".
            del = new TalkDelegate(SayHello);
            // ou
            // del = SayHello;


            // STEP 3 (bis) --> ajout
            // On peut ajouter ou enlever de cet objet delegate, 
            // des méthodes à exécuter avec les opérateurs 
            // "+=" et "-="..
            del += new TalkDelegate(SayGoodBye);
            // ou :
            //  del += SayGoodBye

            // STEP 3 (bis) --> suppression
            // Ici, on va supprimer la méthode "SayGoodBye"
            // de la liste des méthodes stockées dans l'instance
            // du delegate :
            del -= new TalkDelegate(SayGoodBye);
            // ou :
            //  del -= SayGoodBye

            // STEP 4 :
            // On exécute le delegate, ce qui aura pour effet
            // d'appeler successivement toutes les méthodes que 
            // l'on aura stockées dans l'instance du delegate.
            del();

        }
        
        public static void SayHello()
        {
            Console.WriteLine("Hello");
        }

        public static void SayGoodBye()
        {
            Console.WriteLine("Bye");
        }


        public static void Test_Delegates_02()
        {
            CalculationDelegate del;

            del = Add;

            del += Substract;
            
            long result = del(10, 15);
            



            Console.WriteLine("Result : {0}", result  );

        }


        public static long Add(int x, int y)
        {
            return x + y;
        }

        public static long Substract(int x, int y)
        {
            return x - y;
        }






    }
}
